#include "extFS.h"

int main()
{
	fs_start();    /* 启动文件系统 */

	fs_diskinfo();	/* 打印磁盘信息 */

	fs_shell();    /* 进入shell */

	char aa[100] = "666";
	int a = strtol(aa, NULL, 8); 
	printf("%d %o\n", a, a);
	u_int16_t access = 0444;
	access = a;
	printf("%d %o\n", access, access);
	printf("%d %d %d\n", access>>8 & 1, access>>7 & 1, access>>6 & 1);
}

/*	设计说明
1 参考linux文件系统ext2设计实现, 见书6.7.5

2 主要数据结构: superblock(超级块), inode(索引节点), catalog(文件项), block_bitmap(块位图), inode_bitmap(索引节点位图)

3 Ext2磁盘布局见书P304, 与之不完全相同, 实际布局如下：

		   	磁盘起始地址 -> | superblock | block_bitmap | inode_bitmap | inode area |                        block area                     |
			                                                                     /                                                         \
																			    /                                                           \
																		       | block group | block group | block group | ... | block group |
																		       
																			   first block in block group store free stack info

4 块大小1KB, 块数1048576, 磁盘容量为1GB, 索引节点大小128B, 索引节点数8192, 可根据需要调整

4 空闲块采用成组链接法来分配和回收

5 采用三级混合索引, 支持单个最大文件大小约为16GB

6 catalog 大小设计为32字节, 减去4字节的inode地址, 可用于存储文件名的大小为28字节, 可扩大至64字节, 能支持更长的文件名
*/


/*	可用命令	(绝对路径和多级路径未实现, 只能操作当前目录)
1 ls		打印当前目录下文件项
2 cd		切换目录	cd _dirname_
3 mkdir		创建目录	mkdir _dirname_
4 rmdir		删除目录	rmdir _dirname_
4 diskinfo	打印磁盘信息
5 touch		创建一个空白文件	touch _filename_
6 write		对一个文件覆盖写	write _filename_
7 cat		将文件内容打印	cat _filename_
8 rm		删除文件	rm _filename_
9 cls		清屏
10 pwd		打印当前目录
11 bigfile	大文件测试, 生成一个500M文件, 足够测试三级混合索引的分配和回收，系统实际最大支持16G, 但当前磁盘容量设定为1G
12 chmod	更改文件访问权限	chmod 777 _filename_	4-r 2-w 1-x
13 format	格式化磁盘
14 exit		退出文件系统
*/


/*	存在问题
1 退出文件系统必须使用exit命令, 直接退出, 会导致此次运行的操作和内容丢失

2 前后写了四天, 代码有点混乱, 之前写的部分没考虑三级混合索引, 只使用了10个直接块

3 绝对路径和多级路径未实现, 只能操作当前目录

4 还有很多小问题, 发现了再慢慢改, 从头检查一遍代码太累了。
*/